﻿using System;
using System.Text;
using Contact.DAL.Models.Worktime;
using ContactMvc4TB.Helpers.RightsManagement;
using EFDataModel;
using EFDataModel.Enums;
using GlobalResources;

namespace ContactMvc4TB.Models.Worktime.Helpers
{
    public class WorktimeHelper
    {
        #region Strings
        /// <summary>
        /// String zum Anlegen und speichern eines neuen Arbeitszeiteintrags
        /// </summary>
        public static string BtnCreateWorktimeEntry = WorktimeViews.BtnCreateWorktimeEntry;

        /// <summary>
        /// Für den aktuell ausgewählten Tag die Standardwerte für Arbeitszeit und Pause anlegen
        /// </summary>
        public static string BtnCreateDefaultEntryWithPause = WorktimeViews.BtnCreateDefaultEntryWithPause;

        /// <summary>
        /// Für den aktuell ausgewählten Tag die Standardwerte für Arbeitszeit anlegen
        /// </summary>
        public static string BtnCreateDefaultWorktime = WorktimeViews.BtnCreateDefaultWorktimeEntry;

        /// <summary>
        /// Für den aktuell ausgewählten Tag die Standardwerte für die Pause anlegen
        /// </summary>
        public static string BtnCreateDefaultBreaktime = WorktimeViews.BtnCreateDefaultBreaktimeEntry;

        /// <summary>
        /// Zurücksetzten der Anzeigedaten, aber das Datum beibehalten.
        /// </summary>
        public static string BtnResetData = WorktimeViews.BtnResetData;

        /// <summary>
        /// Das ausgewählte Datum laden.
        /// </summary>
        public static string BtnLoadDate = WorktimeViews.BtnLoadDate;

        /// <summary>
        /// Id für den Button der das Datum einen Tag zuvor laden soll
        /// </summary>
        public static string BtnIdPrevDay = "WorktimePrevDay";

        /// <summary>
        /// Id für den Button der das Datum einen Tag später laden soll
        /// </summary>
        public static string BtnIdNextDay = "WorktimeNextDay";
        #endregion

        #region Static Functions
        /// <summary>
        /// Gibt zum übergebenen Typ den passenden Anzeigestring zurück
        /// </summary>
        public static string GetWorktimeTypeString(EWorktimeType type)
        {
            switch (type)
            {
                case EWorktimeType.Worktime:
                    return WorktimeViews.ArbeitszeitKategorie;
                case EWorktimeType.Breaktime:
                    return WorktimeViews.PauseKategorie;
                case EWorktimeType.Holiday:
                    return WorktimeViews.UrlaubKategorie;
                case EWorktimeType.Illness:
                    return WorktimeViews.KrankheitKategorie;
                case EWorktimeType.Projecttime:
                    return WorktimeViews.ProjektKategorie;
                case EWorktimeType.Qualification:
                    return WorktimeViews.WeiterbildungKategorie;
                case EWorktimeType.OfficalHoliday:
                    return WorktimeViews.OfficialHoliday;
            }

            return string.Empty;
        }

        /// <summary>
        /// Herunterladen aller Arbeitszeitdaten als CSF Datei.
        /// </summary>
        public static string DownloadAllData(long userId)
        {
            //Prüfen ob der aktuelle User auch das Recht hat die Dateien herunterzuladen.
            if (WebRights.Right().Check(EUserRights.WorktimeSettingsEdit) || CurrentSession.GetCurrentUser().ID == userId)
            {
                StringBuilder csv = new StringBuilder();
                //Alle Einträge durchgehen und zusammenfügen
                WorktimeRepository repository = new WorktimeRepository(CurrentHttpContext.GetDataModel());
                foreach (EFWorktimeEntry entry in repository.GetAllWorktimeEntries(userId))
                {
                    csv.Append(GetWorktimeTypeString(entry.WorkingtimeType)).Append(";");
                    csv.Append(entry.StartTime.ToString(WebConstants.CsvDateTimeFormat)).Append(";");
                    csv.Append(entry.EndTime.ToString(WebConstants.CsvDateTimeFormat)).Append(";");
                    csv.Append(entry.TimeInMinutes).Append(";");
                    csv.Append(entry.Description.Replace(Environment.NewLine, string.Empty)).Append(";");
                    csv.Append(entry.Notice.Replace(Environment.NewLine, string.Empty)).Append(";");
                    csv.AppendLine();
                }

                return csv.ToString();
            }

            return string.Empty;
        }

        /// <summary>
        /// Setzt den übergebenen Filtertyp für das eigene Profil
        /// </summary>
        /// <param name="type">Der Filtertyp der gesetzt werden soll</param>
        public static void SetWorktimefilter(EWorktimeListTypes type)
        {
            //Mein eigenes Setting laden und dann den passenden Filtertyp setzten.
            WorktimeSettingsRepository repository = new WorktimeSettingsRepository(CurrentHttpContext.GetDataModel());
            EFWorktimeSetting setting = repository.LoadWorktimeSetting(CurrentSession.GetCurrentUser().ID);

            if (setting != null)
            {
                setting.WorktimeListType = type;
                repository.SaveWorktimeSetting(setting);
            }
        }
        #endregion
    }
}